package com.cskaoyan.mall.cart.service.impl;

import com.cskaoyan.mall.cart.api.dto.CartInfoDTO;
import com.cskaoyan.mall.cart.converter.SkuInfoConverter;
import com.cskaoyan.mall.cart.client.ProductApiClient;
import com.cskaoyan.mall.cart.service.CartService;
import com.cskaoyan.mall.common.constant.RedisConst;
import com.cskaoyan.mall.common.util.DateUtil;
import org.redisson.api.RMap;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

/**
 * @author Macro_Ray
 * @since 2024/6/22 下午3:00
 */
@Service
@SuppressWarnings("all")
public class CartServiceImpl implements CartService {

    @Autowired
    private ProductApiClient productApiClient;
    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    SkuInfoConverter skuInfoConverter;

    @Override
    public void addToCart(String userId, Long skuId, Integer skuNum) {
        // 如何判断，skuNum表示的是新增商品，还是修改数量？

        // 通过 userId 拼接一个key   user:{userId}:cart
        String cartKey = getCartKey(userId);

        RMap<Long, CartInfoDTO> cart = redissonClient.getMap(cartKey);
        if (cart.get(skuId) == null) {
            // 新增
            CartInfoDTO cartInfoDTO = new CartInfoDTO();

            // todo
            // 除了 skuId，userId， skuNum， createTime， updateTime，其他属性，调用商品服务

            // 存储到redis，放入map

        } else {
            //  修改数量
            CartInfoDTO cartInfoDTO = cart.get(skuId);

        }
    }

    /**获取购物车的key*/
    private String getCartKey(String userId) {
        //定义key user:1:cart
        return RedisConst.USER_KEY_PREFIX + userId + RedisConst.USER_CART_KEY_SUFFIX;
    }


    /**
     * 通过用户Id 查询购物车列表
     * 合并userId与userTempId的购物车、删除userTempId的购物车
     */
    @Override
    public List<CartInfoDTO> getCartList(String userId, String userTempId) {

        // todo

        // 获取用户登录之后的购物车key
        String cartKey = getCartKey(userId);
        // 登录之后的购物车
        RMap<Long, CartInfoDTO> cart = redissonClient.getMap(cartKey);

        // 获取用户登录之后的购物车key
        String cartTempKey = getCartKey(userTempId);
        // 登录之后的购物车
        RMap<Long, CartInfoDTO> tempCart = redissonClient.getMap(cartTempKey);


        // 1. 如何value的集合
        Collection<CartInfoDTO> cartValues = cart.values();
        List<CartInfoDTO> cartInfoDTOs = new ArrayList<>(cartValues);

        Collection<CartInfoDTO> tempCartValues = tempCart.values();
        List<CartInfoDTO> tempCartInfoDTOs = new ArrayList<>(tempCartValues);

        // ....

        // 合并之后的list
        List<CartInfoDTO> mergedList = new ArrayList<>();

        // 2. 排序
        Collections.sort(mergedList, (first, second) ->{
             // 第三个参数表示比较单位， 只比较到秒即可
             return DateUtil.truncatedCompareTo(second.getCreateTime(), first.getCreateTime(), Calendar.SECOND);
        });

        return mergedList;
    }


    /**
     * @param skuId         商品id
     * @param userId        用户id
     * @return: void
     * 功能描述: 删除购物车指定的商品
     */
    @Override
    public void deleteCart(Long skuId, String userId) {

    }

    @Override
    public void checkCart(String userId, Integer isChecked, Long skuId) {

    }


    /**
     * @param userId
     * @return: void
     * 功能描述: 删除购物车中所有选中的商品
     */
    @Override
    public void deleteChecked(String userId) {

    }



    @Override
    public List<CartInfoDTO> getCartCheckedList(String userId) {

        return null;
    }

    @Override
    public void delete(String userId, List<Long> skuIds) {

    }

    @Override
    public void refreshCartPrice(String userId, Long skuId) {

    }
}
